#include<iostream>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>

using namespace std;

int main()
{
//	pid_t id=fork();
	//（3） 增加一个环境变量 --- 看子进程被别的程序替换后，在新程序中看是否能拿到这个环境变量
	//putenv("Barselona=1234");
	
	// 覆盖替换程序的环境变量表
	char* myenv[]={
		"Manchester=2022/2023",
		"Kevin De Buryne=10",
		NULL
	};// 注意环境变量表最后一个成员必须是NULL

	execle("./myproce2","myproce2",NULL,myenv);

//	if(id == 0)// 子
//	{
		//execlp("ls","ls","-l","-a",NULL);// 利用PATH环境变量

		//char* const myargv[]={"ls","-l","-a",NULL};
		//execv("/usr/bin/ls",myargv);// 利用数组

		//execl("./myproce2","myproce2",NULL);// 调C语言程序
		//execl("/usr/bin/bash","bash","stack.sh",NULL);// 调脚本语言
		// 之所以可以跨语言调用程序，是因为语言运行起来本质是进程

		//（3） 子进程被替换后，能否在新进程拿到环境变量？
		//execl("./myproce2","myproce2",NULL);// myproce2 依赖的是 Bar.c
		
		// 覆盖替换程序的环境变量表
		//execle("./myproce2","myproce2",NULL,myenv);
//	}
//	else if(id > 0)// 父
//	{
		//wait(NULL);

//	}

	// 实验一 --- execl函数替换成功后，不会在执行execl后续的代码
	//        --- 子进程被替换后不影响父进程对它的回收，因为回收的是子进程的task_struct，而子进程被替换的是数据和代码
//	pid_t id=fork();
//	
//	if(id == 0)// 子
//	{
//		execl("/usr/bin/ls","ls","-l","-a",NULL);
//		exit(3);
//	}
//	else if(id > 0)// 父
//	{
//		int stauts=0;
//		waitpid(-1,&stauts,0);
//		int exit_code=stauts&0x7F;
//		cout<<"exit code:"<<exit_code<<endl;
//	}

//	pid_t id=fork();
//	
//	if(id == 0)// 子
//	{
//		
//	}
//	else if(id > 0)// 父
//	{
//		
//	}
	return 0;
}
